home *** CD-ROM | disk | FTP | other *** search
/ Info-Mac 3 / Info_Mac_1994-01.iso / Text Processing / BBEdit Ext Development Kit / Extension Sources / prefix.c < prev    next >
C/C++ Source or Header  |  1993-07-24  |  4KB  |  202 lines

  1. #include <SetupA4.h>
  2.  
  3. #include "ExternalInterface.h"
  4. #include "DialogUtilities.h"
  5.  
  6. /*
  7.     This external shows the use of some less trivial functionality.
  8.  
  9.     It puts up a dialog, and uses the text entered in the text field
  10.     to prefix every line, optionally in the selection.
  11. */
  12.  
  13. enum
  14. {
  15.     sel_only = 3,
  16.     
  17.     insert,
  18.     delete,
  19.     
  20.     beginning,
  21.     end,
  22.     
  23.     prefix_str
  24. };
  25.  
  26. static struct
  27. {
  28.     Boolean    insert;
  29.     Boolean    line_start;
  30.     Boolean    sel_only;
  31.     Boolean    pad;
  32.     
  33.     Str255    prefix_str;
  34. } prefix_info;
  35.  
  36. static void maintain_buttons(DialogPtr d)
  37. {
  38.     SetDlgCtl(d, insert, prefix_info.insert);
  39.     SetDlgCtl(d, delete, ! prefix_info.insert);
  40.     
  41.     SetDlgCtl(d, beginning, prefix_info.line_start);
  42.     SetDlgCtl(d, end, ! prefix_info.line_start);
  43.  
  44.     SetDlgCtl(d, sel_only, prefix_info.sel_only);
  45. }
  46.  
  47. pascal void main(ExternalCallbackBlock *callbacks, WindowPtr w)
  48. {
  49.     DialogPtr d;
  50.     GrafPtr save_port;
  51.     
  52.     short act_len;
  53.     
  54.     long sel_end, sel_start, first_char;
  55.     long start_line, end_line;
  56.     long old_start;
  57.     
  58.     short item;
  59.     
  60.     Handle text;
  61.     char *s;
  62.     
  63.     RememberA0();
  64.     SetUpA4();
  65.     
  66.     GetPort(&save_port);
  67.     
  68.     d = callbacks->CenterDialog(128);
  69.     SetPort(d);
  70.     
  71.     callbacks->GetSelection(&sel_start, &sel_end, &first_char);
  72.     
  73.     callbacks->GetPreference('Prfx', sizeof(prefix_info), &prefix_info, &act_len);
  74.     if (act_len <= 0)
  75.     {
  76.         prefix_info.insert = TRUE;
  77.         prefix_info.line_start = TRUE;
  78.         BlockMove("\p> ", prefix_info.prefix_str, 3);
  79.         prefix_info.sel_only = sel_end != sel_start;
  80.     }
  81.     
  82.     XAbleDlgCtl(d, sel_only, prefix_info.sel_only);
  83.         
  84.     SetStrItem(d, prefix_str, prefix_info.prefix_str);
  85.     
  86.     SelIText(d, prefix_str, 0, 255);
  87.     
  88.     do {
  89.         maintain_buttons(d);
  90.         
  91.         ModalDialog(callbacks->StandardFilter, &item);
  92.         
  93.         switch (item)
  94.         {
  95.             case insert:
  96.             case delete:
  97.                 prefix_info.insert = (item == insert);
  98.                 break;
  99.                 
  100.             case beginning:
  101.             case end:
  102.                 prefix_info.line_start = (item == beginning);
  103.                 break;
  104.                 
  105.             case sel_only:
  106.                 prefix_info.sel_only = ! prefix_info.sel_only;
  107.                 break;
  108.         }
  109.     } while ((item != 1) && (item != 2));
  110.     
  111.     ReadStrItem(d, prefix_str, prefix_info.prefix_str);
  112.         
  113.     DisposDialog(d);
  114.     SetPort(save_port);
  115.     
  116.     if (item == 1) {
  117.         callbacks->SetPreference('Prfx', sizeof(prefix_info), &prefix_info, &act_len);
  118.  
  119.         start_line = 0;
  120.         end_line = callbacks->GetLastLine();
  121.         
  122.         if (prefix_info.sel_only) {
  123.             start_line = callbacks->GetLineNumber(sel_start);
  124.             end_line = callbacks->GetLineNumber(sel_end);
  125.         };
  126.         
  127.         s = (char *)&prefix_info.prefix_str[0];
  128.         
  129.         if (s[0] != 0)
  130.         {
  131.             text = callbacks->GetWindowContents(w);
  132.             
  133.             callbacks->StartProgress("\pChanging Lines…", end_line - start_line, FALSE);
  134.             old_start = start_line;
  135.             
  136.             if (prefix_info.line_start)    
  137.             {
  138.                 if (prefix_info.insert)
  139.                 {
  140.                     for ( ; start_line < end_line; start_line++) {
  141.                         callbacks->DoProgress(start_line - old_start);
  142.                         
  143.                         sel_start = callbacks->GetLinePos(start_line);
  144.                         callbacks->SetSelection(sel_start, sel_start, first_char);
  145.                         callbacks->Insert((char *)&s[1], s[0]); 
  146.                     };
  147.                 }
  148.                 else
  149.                 {
  150.                     for ( ; start_line < end_line; start_line++) {
  151.                         callbacks->DoProgress(start_line - old_start);
  152.                         
  153.                         sel_start = callbacks->GetLinePos(start_line);
  154.                         
  155.                         if (callbacks->FindPattern(*text, sel_start + s[0] + 1, sel_start,
  156.                                                     &s[1], s[0], FALSE) >= 0)
  157.                         {
  158.                             callbacks->SetSelection(sel_start, sel_start + s[0], first_char);
  159.                             callbacks->Delete();
  160.                         }
  161.                     };
  162.                 }
  163.             }
  164.             else
  165.             {
  166.                 if (prefix_info.insert)
  167.                 {
  168.                     for ( ; start_line < end_line; start_line++) {
  169.                         callbacks->DoProgress(start_line - old_start);
  170.                         
  171.                         sel_start = callbacks->GetLinePos(start_line);
  172.                         sel_start = callbacks->GetLineEnd(sel_start);
  173.                         
  174.                         callbacks->SetSelection(sel_start, sel_start, first_char);
  175.                         callbacks->Insert((char *)&s[1], s[0]); 
  176.                     };
  177.                 }
  178.                 else
  179.                 {
  180.                     for ( ; start_line < end_line; start_line++) {
  181.                         callbacks->DoProgress(start_line - old_start);
  182.                         
  183.                         sel_start = callbacks->GetLinePos(start_line);
  184.                         sel_end = callbacks->GetLineEnd(sel_start);
  185.                         
  186.                         if (callbacks->FindPattern(*text, sel_end, sel_end - s[0],
  187.                                                     &s[1], s[0], FALSE))
  188.                         {
  189.                             callbacks->SetSelection(sel_end - s[0], sel_end, first_char);
  190.                             callbacks->Delete();
  191.                         }
  192.                     };
  193.                 }
  194.             }
  195.             
  196.             callbacks->DoneProgress();
  197.         }
  198.     };
  199.     
  200.     RestoreA4();
  201. }
  202.